package com.ftg.learn.chapter06;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.stereotype.Component;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.WebServlet;

/**
 *
 * spring mvc 通过java base完成配置操作
 *  思路 ： 通过实现化我们web项目
 *        构建出来web.xml
 *        在里面写大量的servlet filter
 *
 *    用java类来完成上述功能
 *
 * @author kangjx
 * @date 2022/11/8
 */
public class MyselfWebxml implements  WebApplicationInitializer{
//    javaweb web.xml 第一入口点  想通过java完成

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {

        System.out.println("我没有走是吗！？");

        //java base
        // AnnotationConfigWebApplicationContext  web功能容器  AnnotationConfigApplicationContext 不支持web功能
        AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
        applicationContext.scan("com.ftg.learn.chapter06");
        applicationContext.register();
        applicationContext.refresh();

        // 注入 spring 上下文
        DispatcherServlet dispatcherServlet = new DispatcherServlet(applicationContext);
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", dispatcherServlet);
        registration.setLoadOnStartup(1);
        //前缀  虚拟路径  不参与真实的controller访问地址
        //只做是否被 springmvc拦截请求的判断
        registration.addMapping("/api/*");



        //表示我们在启动服务时要支行的操作
//        2014 年以前的项目
        //1 第一件事情 要声明 spring的监听 用来监听spring容器的容器变化
        //1.1 web.xml里面写的 web-inf/applicationContext.xml 配置文件
        //<listener>
        //  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        //</listener>
        // 1.2 配置文件的迁移和改名操作
        //<context-param>
        //  <param-name>contextConfigLocation</param-name>
        //  <param-value>classpath://spring.xml</param-value>
        //</context-param>

        //2 配置 springmvc 要管理哪些类
        //<servlet>
        //  <servlet-name>app</servlet-name>
        //  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        //  <init-param>
        //      <param-name>contextConfigLocation</param-name>
        //       这个springmvc.xml里面声明的是 @Controller所在的包   以及视图解析器
        //      <param-value>springmvc.xml</param-value>
        //  </init-param>
        //  <load-on-startup>1</load-on-startup>
        //</servlet>
        //
        //<servlet-mapping>
        //  <servlet-name>app</servlet-name>
        //  <url-pattern>/app/*</url-pattern>
        //</servlet-mapping>

    }

    //不是开发的问题，也不是代码问题？
    //项目发布问题

    // 1   learn-spring-07-1.0-SNAPSHOT.war 这是要给客户的真实生产包
    // 2   客户要把这个真实的生产包，发布到tomcat webapps
    // 3   纯java程序
    // 3.1 我们要把java程序打包成为war  pom.xml里面<packaging>war</packaging>
    // 3.2 在idea当中我们要发布是 是生产的解压好以后的文件

    // 3.3 learn-spring-07-1.0-SNAPSHOT.war 可以放到 tomcat webapps里面
    // 但不能直接在idea里面

}
